﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using DevComponents.DotNetBar.Controls;
using DevComponents.DotNetBar;
using Business;
using Entities;

namespace Presentation
{
    public partial class frmLapPhieuNhapSach : DevComponents.DotNetBar.Office2007Form
    {
        bool save;
        private bool isFormClosing = false;
        // Contant for the close message
        private const int WM_CLOSE = 16;
        //override the WndProc msg to trap the WM_CLOSE message
        protected override void WndProc(ref Message m)
        {
            if (m.Msg == WM_CLOSE)
                isFormClosing = true;
            base.WndProc(ref m);
        }
        public frmLapPhieuNhapSach()
        {
            InitializeComponent();

            //Chi tiết phiếu nhập
            dgvPhieuNhap.Columns.Add("STT", "STT");
            dgvPhieuNhap.Columns.Add("MaSach", "Mã sách");
            dgvPhieuNhap.Columns.Add("TenSach", "Tên sách");
            dgvPhieuNhap.Columns.Add("TheLoai", "Thể loại");
            dgvPhieuNhap.Columns.Add("TacGia", "Tác giả");
            dgvPhieuNhap.Columns.Add("SoLuong", "Số lượng");
            dgvPhieuNhap.Columns["STT"].Width = 50;
            dgvPhieuNhap.Columns["TenSach"].ReadOnly = true;
            dgvPhieuNhap.Columns["TheLoai"].ReadOnly = true;
            dgvPhieuNhap.Columns["TacGia"].ReadOnly = true;

            //Tìm kiếm
            
            dgvTimKiem.ReadOnly = true;
            dgvTimKiem.AllowUserToAddRows = false;
            
        }

        private void frmLapPhieuNhapSach_Load(object sender, EventArgs e)
        {

            LapPhieuMoi();
        }

       

        private void dgvTimKiem_CellMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e)
        {
            if (e.ColumnIndex==-1)
            {
               DataGridViewRow row=dgvTimKiem.Rows[e.RowIndex];
                Object[] dataRow = new Object[dgvPhieuNhap.Columns.Count];
                dataRow[0] = (dgvPhieuNhap.Rows.Count == 1) ? 1 : dgvPhieuNhap.Rows.Count;
                int i = 1;
                for (; i < dataRow.Length-1; i++)
                {
                    dataRow[i] = row.Cells[i-1].Value;
                }
                
                ThamSoDTO tonToiDa = ThamSoService.GetThamSoByMaThamSo(2);
                if (tonToiDa.SuDung == 1)
                {
                    int soLuong = int.Parse(row.Cells["SoLuong"].Value.ToString());
                    if (soLuong >= tonToiDa.GiaTri)
                    {
                        MessageBoxEx.Show("Chỉ nhập các sách có lượng tồn nhỏ hơn:" + tonToiDa.GiaTri.ToString(), "Thông báo!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        return;
                    }
                }
                dataRow[i] = ThamSoService.GetThamSoByMaThamSo(1).GiaTri;
                dgvPhieuNhap.Rows.Add(dataRow);

            }
        }

       
       

        
        private void btnLapPhieu_Click(object sender, EventArgs e)
        {
            
            LapPhieu();
           
        }

        private void dgvPhieuNhap_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
        {
            if (isFormClosing)
                return;
            DataGridViewCell cell = dgvPhieuNhap[e.ColumnIndex, e.RowIndex];
            DataGridViewRow row = dgvPhieuNhap.Rows[e.RowIndex];
            int i = -1;
            if (dgvPhieuNhap.Columns[e.ColumnIndex].Name == "MaSach" && e.RowIndex<dgvPhieuNhap.Rows.Count-1)
            {
                if (!int.TryParse(e.FormattedValue.ToString(), out i))
                {
                    e.Cancel = true;                    
                    dgvPhieuNhap.Rows[e.RowIndex].ErrorText = "Phải nhập số nguyên!";
                    return;
                }
                SachDTO s=SachService.GetSachByMaSach(i);
                if (s==null)
                {
                    e.Cancel = true;
                    dgvPhieuNhap.Rows[e.RowIndex].ErrorText = "Không tồn tại mã sách này!";
                }
                else
                {
                    ThamSoDTO TonToiDa = ThamSoService.GetThamSoByMaThamSo(2);
                    if (TonToiDa.SuDung == 1 && s.SoLuong>=TonToiDa.GiaTri)
                    {
                        e.Cancel = true;
                        row.ErrorText = "Chỉ nhập các sách có lượng tồn nhỏ hơn: " + TonToiDa.GiaTri.ToString();
                    }
                    else
                    {
                        row.ErrorText = "";
                        row.Cells["TenSach"].Value = s.TenSach;
                        row.Cells["TheLoai"].Value = TheLoaiService.GetTheLoaiByMaLoai(s.MaTheLoai).TenTheLoai;
                        row.Cells["TacGia"].Value = TacGiaService.GetTacGiaByMaTacGia(s.MaTacGia).TenTacGia;
                 
                    }
                }
                
                return;
            }
            row.ErrorText = "";
            if (dgvPhieuNhap.Columns[e.ColumnIndex].Name == "SoLuong" && e.RowIndex<dgvPhieuNhap.Rows.Count-1)
            {
                if (!int.TryParse(e.FormattedValue.ToString(), out i) || i<0)
                {
                    e.Cancel = true;
                    dgvPhieuNhap.Rows[e.RowIndex].ErrorText = "Phải nhập số nguyên dương!";
                    return;
                }
                row.ErrorText = "";
                
                ThamSoDTO NhapToiThieu=ThamSoService.GetThamSoByMaThamSo(1);
                 
                if (NhapToiThieu.SuDung==1 && i<NhapToiThieu.GiaTri)
                {
                    e.Cancel = true;
                    dgvPhieuNhap.Rows[e.RowIndex].ErrorText = "Số lượng nhập phải lớn hơn " + NhapToiThieu.GiaTri.ToString();
                    return;
                }
                row.ErrorText = "";
            }           

        }


        //hàm lập phiếu
        private bool LapPhieu()
        {
            DataGridViewRow row;
            if (dgvPhieuNhap.Rows.Count <= 1)
            {
                MessageBoxEx.Show("Không thể lập phiếu", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }
            for (int i = 0; i < dgvPhieuNhap.Rows.Count - 1; i++)
            {
                row = dgvPhieuNhap.Rows[i];
                if (row.Cells["MaSach"].Value == null)
                {
                    MessageBoxEx.Show("Không thể lập phiếu", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    row.ErrorText = "Chưa nhập mã sách!";

                    return false;
                }
                if (row.Cells["SoLuong"].Value == null)
                {
                    MessageBoxEx.Show("Không thể lập phiếu", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    row.ErrorText = "Chưa nhập số lượng!";

                    return false;
                }
            }
            #region //Lấy báo cáo tồn của tháng lập phiếu nhập

            //
            bool tonTai=BaoCaoTonService.Exists(dtiNgayLapPhieu.Value);
            BaoCaoTonDTO baoCaoTon;
             int maBaoCaoTon = BaoCaoTonService.GetCurrentID()+1;
            if (tonTai)
            {
                baoCaoTon = BaoCaoTonService.GetBaoCaoTonByThang(dtiNgayLapPhieu.Value);
            }
            else
            {
                baoCaoTon = new BaoCaoTonDTO();               
                baoCaoTon.TinhTrang = 1;
                baoCaoTon.Thang = dtiNgayLapPhieu.Value;
                BaoCaoTonService.Insert(baoCaoTon);
            }
            #endregion
            //Tạo danh sách các ChiTietPhieuNhapDTO
            List<ChiTietPhieuNhapDTO> listChiTietPhieuNhap = new List<ChiTietPhieuNhapDTO>();
            for (int i = 0; i < dgvPhieuNhap.Rows.Count - 1; i++)
            {
                ChiTietPhieuNhapDTO ct = new ChiTietPhieuNhapDTO();
                ct.MaPhieuNhap = int.Parse(this.txtMaPhieuNhap.Text);
                ct.MaSach = int.Parse(dgvPhieuNhap["MaSach", i].Value.ToString());
                ct.SoLuong = int.Parse(dgvPhieuNhap["SoLuong", i].Value.ToString());
                listChiTietPhieuNhap.Add(ct);
                #region //Xử lý nhập cho báo cáo
                if (tonTai)
                {                    
                    if (ChiTietBaoCaoTonService.Exists(baoCaoTon.MaBaoCaoTon, ct.MaSach))
                    {
                        ChiTietBaoCaoTonDTO chiTiet = ChiTietBaoCaoTonService.GetChiTietBaoCaoTon(baoCaoTon.MaBaoCaoTon, ct.MaSach);
                        chiTiet.PhatSinh = ct.SoLuong+chiTiet.PhatSinh;
                        chiTiet.TonCuoi = chiTiet.TonDau + chiTiet.PhatSinh;
                        ChiTietBaoCaoTonService.Update(chiTiet);
                    }
                    else
                    {
                        ChiTietBaoCaoTonDTO chiTietBaoCaoTon = new ChiTietBaoCaoTonDTO();
                        chiTietBaoCaoTon.MaBaoCaoTon = baoCaoTon.MaBaoCaoTon;
                        chiTietBaoCaoTon.MaSach = ct.MaSach;
                        chiTietBaoCaoTon.TonDau = SachService.GetSachByMaSach(ct.MaSach).SoLuong;
                        chiTietBaoCaoTon.PhatSinh = ct.SoLuong;
                        chiTietBaoCaoTon.TonCuoi = chiTietBaoCaoTon.TonDau + chiTietBaoCaoTon.PhatSinh;
                        ChiTietBaoCaoTonService.Insert(chiTietBaoCaoTon);
                    }
                }
                else
                {

                    ChiTietBaoCaoTonDTO chiTietBaoCaoTon = new ChiTietBaoCaoTonDTO();
                    chiTietBaoCaoTon.MaBaoCaoTon = maBaoCaoTon;
                    chiTietBaoCaoTon.MaSach = ct.MaSach;
                    chiTietBaoCaoTon.TonDau = SachService.GetSachByMaSach(ct.MaSach).SoLuong;
                    chiTietBaoCaoTon.PhatSinh = ct.SoLuong;
                    chiTietBaoCaoTon.TonCuoi = chiTietBaoCaoTon.TonDau + chiTietBaoCaoTon.PhatSinh;
                    ChiTietBaoCaoTonService.Insert(chiTietBaoCaoTon);

                }
                #endregion
            }

            PhieuNhapService.InsertPhieuNhap(listChiTietPhieuNhap, dtiNgayLapPhieu.Value);
            dgvPhieuNhap.ReadOnly = true;

            MessageBoxEx.Show("Lập phiếu thành công", "Thông báo!", MessageBoxButtons.OK, MessageBoxIcon.Information);
            btnLapPhieu.Enabled = false;
            return true;
        }

        private void btnTimKiem_Click(object sender, EventArgs e)
        {
            List<SachDTO> listSach = SachService.SearchByTenSach(txtTimKiem.Text);
            DataTable dt = new DataTable();
            dt.Columns.Add("MaSach");
            dt.Columns.Add("TenSach");
            dt.Columns.Add("TheLoai");
            dt.Columns.Add("TacGia");
            dt.Columns.Add("SoLuong");
            foreach(SachDTO s in listSach)
            {
                
                dt.Rows.Add(s.MaSach,s.TenSach,TheLoaiService.GetTheLoaiByMaLoai(s.MaTheLoai).TenTheLoai,TacGiaService.GetTacGiaByMaTacGia(s.MaTacGia).TenTacGia,s.SoLuong);
            }
            dgvTimKiem.DataSource = dt;
            dgvTimKiem.Columns["MaSach"].HeaderText = "Mã sách";
            dgvTimKiem.Columns["TenSach"].HeaderText = "Tên sách";
            dgvTimKiem.Columns["TheLoai"].HeaderText = "Thể loại";
            dgvTimKiem.Columns["TacGia"].HeaderText = "Tác giả";
            dgvTimKiem.Columns["SoLuong"].HeaderText = "Số lượng";
            
        }

        private void dgvPhieuNhap_UserAddedRow(object sender, DataGridViewRowEventArgs e)
        {

            dgvPhieuNhap.Rows[e.Row.Index - 1].Cells["STT"].Value = e.Row.Index ;
             
        }


        private void dgvPhieuNhap_UserDeletingRow(object sender, DataGridViewRowCancelEventArgs e)
        {
            for (int i = e.Row.Index; i < dgvPhieuNhap.Rows.Count - 1; i++)
            {
                dgvPhieuNhap["STT", i].Value = i;
            }
        }

        private void btnLapPhieuMoi_Click(object sender, EventArgs e)
        {
            LapPhieuMoi();
        }

        private void LapPhieuMoi()
        {
            dtiNgayLapPhieu.Value = DateTime.Now;
            int id = PhieuNhapService.GetCurrentID();
            if (id == 1 && PhieuNhapService.Exists(id))
                id = id + 1;
            txtMaPhieuNhap.Text = id.ToString();
            dgvPhieuNhap.Rows.Clear();
            btnLapPhieu.Enabled = true;
            dgvPhieuNhap.ReadOnly = false;
        }

        private void btnThoat_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void frmLapPhieuNhapSach_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (dgvPhieuNhap.RowCount == 1)
                return;
            if (btnLapPhieu.Enabled)
            {
                DialogResult r = MessageBoxEx.Show("Bạn có muốn lưu phiếu nhập?", "Thông báo!", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);
                if (r == DialogResult.Cancel)
                {
                    e.Cancel = true;
                    isFormClosing = false;
                }
                else if (r == DialogResult.Yes)
                {
                    if (!LapPhieu())
                    {
                        e.Cancel = true;
                        isFormClosing = false;
                    }
                }
            }
        }

        private void dgvPhieuNhap_RowValidating(object sender, DataGridViewCellCancelEventArgs e)
        {
            if (isFormClosing)
                return;
            if (e.RowIndex == dgvPhieuNhap.RowCount - 1)
                return;

            for (int i = 0; i < dgvPhieuNhap.ColumnCount; i++)
            {
                if (dgvPhieuNhap[i, e.RowIndex].EditedFormattedValue.ToString() == "")
                {
                    MessageBoxEx.Show("Không được bỏ trống!");
                    dgvPhieuNhap.CurrentCell = dgvPhieuNhap[i, e.RowIndex];
                    dgvPhieuNhap.BeginEdit(true);
                    e.Cancel = true;
                    return;
                    
                }
            }
        }

        private void buttonX1_Click(object sender, EventArgs e)
        {
            MessageBox.Show(ChiTietBaoCaoTonService.Exists(1, 32).ToString());
        }
    }
}
